package vip.zhenzicheng.test.jvm;

import org.junit.jupiter.api.Test;
import org.openjdk.jol.info.ClassLayout;

/**
 * 锁升级源码证明hashCode去哪了
 *
 * @author zhenzicheng
 * @date 2022-09-14 15:20
 */
public class SynchronizedUpCase {

  // public static void main(String[] args) {
  @Test
  public void test() {
    // test1();
    Object o = new Object();
    synchronized (o) {
      int hashCode = o.hashCode();
      System.out.println("偏向锁过程中遇到一致性哈希计算请求，立即撤销偏向模式，膨胀为重量级锁");
      System.out.println(ClassLayout.parseInstance(o).toPrintable());
    }
  }

  /**
   * 当一个对象计算过哈希码，无法进入偏向状态，直接升级轻量级锁
   */
  private static void test1() {
    // try {
    //   TimeUnit.SECONDS.sleep(5);
    // } catch (InterruptedException e) {
    //   e.printStackTrace();
    // }
    Object o = new Object();
    System.out.println("应该是偏向锁");
    System.out.println(ClassLayout.parseInstance(o).toPrintable());

    int hashCode = o.hashCode();

    synchronized (o) {
      System.out.println("本应该是偏向锁，但是由于计算过哈希码，导致直接升级为轻量级锁");
      System.out.println(ClassLayout.parseInstance(o).toPrintable());
    }
  }
}
